package com.wongoing.api.pay.manager;

import java.io.IOException;
import java.util.Map;

import javax.xml.bind.JAXBException;

import com.alipay.api.AlipayApiException;
import com.alipay.api.response.AlipayFundTransOrderQueryResponse;
import com.alipay.api.response.AlipayFundTransToaccountTransferResponse;
import com.wongoing.apiclient.alipay.AlipayManagerImpl;
import com.wongoing.apiclient.alipay.IAlipayManager;
import com.wongoing.apiclient.alipay.app.AlipayAppManagerImpl;
import com.wongoing.apiclient.alipay.app.IAlipayAppManager;
import com.wongoing.apiclient.alipay.query.Alipay;
import com.wongoing.apiclient.weixin.IWxPayManager;
import com.wongoing.apiclient.weixin.WxPayManagerImpl;

/**
 * 功能说明：支付对外调用接口（区分微信支付宝及所在功能）
 * 修改说明：包含微信及支付宝
 * @author 吴兆强
 * @date 2018年6月19日 下午9:43:32
 * @version V0.1
 */
public class PayManager {
	
	private static PayManager instance;
	private static IWxPayManager wxPayManager;
	private static IAlipayAppManager alipayAppManager;
	private static IAlipayManager alipayManager;
	
	//单例模式
	public synchronized static PayManager getInstance() {
		if(instance==null) {
			wxPayManager = new WxPayManagerImpl();
			alipayAppManager =  new AlipayAppManagerImpl();
			alipayManager = new AlipayManagerImpl();
			instance = new PayManager();
		}
		return instance;
	}
	
	public PayManager() {
		super();
	}
	
	/*微信调用区域 starting*/
	/**
	 * 功能说明：微信手机APP调用接口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月19日 下午5:14:56
	 * @param out_trade_no 商户订单号
	 * @param total_fee 总金额
	 * @param body 商品描述
	 * @param product_id 产品ID
	 * @param ip 请求IP
	 * @return
	 * @throws Exception
	 */
	public String wxH5Pay(String out_trade_no, String total_fee, String body,String product_id, String ip) throws Exception{
		return wxPayManager.wxH5Pay(out_trade_no, total_fee, body, product_id, ip);
	}
	
	/**
	 * 功能说明：微信公众号支付调用接口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月19日 下午10:23:48
	 * @param openid 微信openId
	 * @param outTradeNo 商户订单号
	 * @param totalFee 总金额
	 * @param body 商品描述
	 * @param productId 产品ID
	 * @param ip 请求IP
	 * @return
	 * @throws Exception
	 */
	public Map<String,String> wxPublicAccountPay(String openid, String outTradeNo, String totalFee, String body, String productId, String ip) throws Exception{
		return wxPayManager.wxPublicAccountPay(openid, outTradeNo, totalFee, body, productId, ip);
	}
	
	/**
	 * 功能说明：微信网页扫码支付调起接口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月28日 上午8:44:10
	 * @param out_trade_no
	 * @param total_fee
	 * @param body
	 * @param product_id
	 * @param ip
	 * @return
	 * @throws Exception
	 */
	public String wxWebScanQRCode(String outTradeNo, String totalFee, String body, String productId,String ip, String returnUrl)throws Exception{
		return wxPayManager.wxWebScanQRCodePay(outTradeNo, totalFee, body, productId, ip, returnUrl);
	}
	
	/**
	 * 功能说明：微信订单查询统一入口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月28日 上午9:45:35
	 * @param outTradeNo
	 * @return
	 * @throws Exception
	 */
	public Map<String,String> wxPayQuery(String outTradeNo) throws Exception{
		return wxPayManager.wxPayQuery(outTradeNo);
	}
	
	/**
	 * 功能说明：微信退款
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年7月3日 下午3:15:51
	 * @param out_trade_no 商户订单号
	 * @param out_refund_no 商户退款号
	 * @param total_fee 总金额
	 * @param refund_fee 退款金额
	 * @return
	 * @throws Exception
	 */
	public Map<String, String> wxPayRefund(String out_trade_no,
			String out_refund_no,
			String total_fee,
			String refund_fee) throws Exception{
		return  wxPayManager.wxPayRefund(out_trade_no, out_refund_no, total_fee, refund_fee);
	}
	
	/*微信调用区域 ending*/
	
	/*支付宝调用区域*/
	
	/**
	 * 功能说明：
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月28日 下午1:04:59
	 * @param WIDout_trade_no 商户订单号
	 * @param WIDtotal_amount 订单总金额
	 * @param WIDsubject 标题
	 * @param WIDbody 描述
	 * @param resturnUrl 同步通知地址
	 * @param ip 
	 * @return
	 * @throws IOException
	 * @throws JAXBException
	 */
	public String alipayWebScanQrCodePay(String WIDout_trade_no, String WIDtotal_amount, String WIDsubject, String WIDbody,
			  String resturnUrl, String ip) throws IOException, JAXBException {
		return alipayManager.alipayWebScanQrCodePay(WIDout_trade_no, WIDtotal_amount, WIDsubject, WIDbody, resturnUrl, ip);
	}
	
	/**
	 * 功能说明：支付宝退款接口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年7月3日 上午8:38:36
	 * @param WIDbatch_no 
	 * @param WIDrefund_date
	 * @param WIDbatch_num
	 * @param WIDdetail_data
	 * @param notify_url
	 * @return
	 * @throws Exception
	 */
	public Map<String,String> alipayRefund(String WIDbatch_no,String WIDrefund_date,
			String WIDbatch_num,String WIDdetail_data,String notify_url) throws Exception{
		return alipayManager.alipayRefund(WIDbatch_no, WIDrefund_date, WIDbatch_num, WIDdetail_data, notify_url);
	}
	
	/**
	 * 功能说明： 支付宝支付查询
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年7月3日 上午9:12:08
	 * @param WIDtrade_no 交易号
	 * @param WIDout_trade_no 商户订单号
	 * @return
	 * @throws Exception 
	 */
	public Alipay alipayQueryToBean(String WIDtrade_no, String WIDout_trade_no) throws Exception {
		return alipayManager.alipayQueryToBean(WIDtrade_no, WIDout_trade_no);
	}
	
	/**
	 * 功能说明：支付宝APP内支付调起接口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月20日 下午1:39:45
	 * @param WIDout_trade_no 商户订单号
	 * @param WIDtotal_amount 金额0.01
	 * @param WIDsubject 标题
	 * @param WIDbody 商品描述
	 * @return
	 */
	public String aplipayH5Pay(String WIDout_trade_no, String WIDtotal_amount, String WIDsubject, String WIDbody) {
		return alipayAppManager.aplipayH5Pay(WIDout_trade_no, WIDtotal_amount, WIDsubject, WIDbody);
	}
	
	/**
	 * 功能说明：支付宝单笔转账到支付宝账户接口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月27日 下午7:58:28
	 * @param outBizNo 商户订单号，唯一
	 * @param payeeAccount 收款方账户类型（支付宝登录号，支持邮箱和手机号格式）
	 * @param amount 转账金额，单位：元。 只支持2位小数，小数点前最大支持13位，金额必须大于等于0.1元。 
	 * @param payeeRealName 收款方真实姓名,选填
	 * @param remark 转账备注，选填
	 * @return
	 * @throws AlipayApiException 
	 */
	public AlipayFundTransToaccountTransferResponse alipayTransfer(String outBizNo, String payeeAccount, String amount, String payeeRealName, String remark) throws AlipayApiException{
		return  alipayAppManager.alipayTransfer(outBizNo, payeeAccount, amount, payeeRealName, remark);
	}
	
	/**
	 * 功能说明：查询转账订单接口
	 * 修改说明：两个参数选择一个填写或两者都填写
	 * @author 吴兆强
	 * @date 2018年6月27日 下午10:54:42
	 * @param outBizNo 商户订单号
	 * @param orderId 支付宝返回订单号
	 * @return
	 * @throws AlipayApiException
	 */
	public AlipayFundTransOrderQueryResponse alipayTransferQuery(String outBizNo, String orderId) throws AlipayApiException{
		return alipayAppManager.alipayTransferQuery(outBizNo, orderId);
	}
	
	
	/**
	 * 功能说明：支付宝银联支付
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年7月7日 上午9:08:08
	 * @param WIDout_trade_no 商户订单号
	 * @param WIDtotal_amount 支付金额
	 * @param WIDsubject 标题
	 * @param WIDbody 描述
	 * @param WIDdefaultbank 所选银行
	 * @param ip 请求ip
	 * @param WIDShowUrl 商品展示地址，非必填可以空
	 * @param resturnUrl 同步回调地址
	 * @return
	 * @throws Exception 
	 * @throws IOException 
	 */
	public String alipayUnionPay(String WIDout_trade_no, String WIDtotal_amount, String WIDsubject, String WIDbody,String WIDdefaultbank,
			String ip, String  WIDShowUrl, String resturnUrl) throws IOException, Exception{
		return alipayManager.alipayUnionPay(WIDout_trade_no, WIDtotal_amount, WIDsubject, WIDbody, WIDdefaultbank, ip, WIDShowUrl, resturnUrl);
	}
}
